using System;
using Server.SkillHandlers;

namespace Server.Spells.Ninjitsu;

public class Backstab : NinjaMove
{
    public override int BaseMana => 30;
    public override double RequiredSkill => Core.ML ? 40.0 : 20.0;

    // You prepare to Backstab your opponent.
    public override TextDefinition AbilityMessage { get; } = 1063089;

    public override bool ValidatesDuringHit => false;

    public override double GetDamageScalar(Mobile attacker, Mobile defender)
    {
        var ninjitsu = attacker.Skills.Ninjitsu.Value;

        return 1.0 + ninjitsu / 360 + Tracking.GetStalkingBonus(attacker, defender) / 100;
    }

    public override bool Validate(Mobile from)
    {
        if (!from.Hidden || from.AllowedStealthSteps <= 0)
        {
            from.SendLocalizedMessage(1063087); // You must be in stealth mode to use this ability.
            return false;
        }

        return base.Validate(from);
    }

    public override bool OnBeforeSwing(Mobile attacker, Mobile defender)
    {
        var valid = Validate(attacker) && CheckMana(attacker, true);

        if (valid)
        {
            attacker.BeginAction<Stealth>();
            Timer.StartTimer(TimeSpan.FromSeconds(5.0), attacker.EndAction<Stealth>);
        }

        return valid;
    }

    public override void OnHit(Mobile attacker, Mobile defender, int damage)
    {
        // Validates before swing

        ClearCurrentMove(attacker);

        attacker.SendLocalizedMessage(1063090); // You quickly stab your opponent as you come out of hiding!

        defender.FixedParticles(0x37B9, 1, 5, 0x251D, 0x651, 0, EffectLayer.Waist);

        attacker.RevealingAction();

        CheckGain(attacker);
    }

    public override void OnMiss(Mobile attacker, Mobile defender)
    {
        ClearCurrentMove(attacker);

        attacker.SendLocalizedMessage(1063161); // You failed to properly use the element of surprise.

        attacker.RevealingAction();
    }
}